﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WeixinSDK.API
{
    /// <summary>
    /// 微信多媒体文件
    /// </summary>
    public static class MediaFile
    {
        /// <summary>
        /// 上传多媒体文件
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="mediaType">媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）</param>
        /// <param name="mediaFilePath">媒体文件本地路径</param>
        /// <returns></returns>
        public static UploadResult Upload(string access_token, MediaType mediaType, string mediaFilePath)
        {
            var url = WxApiHelper.BuildApiUrl(WxApiHelper.Categroy.media, WxApiHelper.Verb.upload, access_token, "&type=" + mediaType.ToString());

            var bytes = new WxWebClient().UploadFile(url, "POST", mediaFilePath);

            var json = Encoding.UTF8.GetString(bytes);

            return WxJson.DeserializeObject<UploadResult>(json);
        }

        /// <summary>
        /// 下载多媒体文件
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="mediaId">媒体文件ID</param>
        /// <returns>如果下载成功，返回null</returns>
        public static WxError Download(string access_token, string mediaId, string savePath)
        {
            byte[] bytes;
            var err = Download(access_token, mediaId, out bytes);
            if (err != null) System.IO.File.WriteAllBytes(savePath, bytes);
            return err;
        }

        /// <summary>
        /// 下载多媒体文件
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="mediaId">媒体文件ID</param>
        /// <returns>如果下载成功，返回null</returns>
        public static WxError Download(string access_token, string mediaId, out byte[] mediaBytes)
        {
            var url = WxApiHelper.BuildApiUrl(WxApiHelper.Categroy.media, WxApiHelper.Verb.upload, access_token, "&media_id=" + mediaId);

            var wc = new WxWebClient();

            mediaBytes = wc.DownloadData(url);

            var disposition = wc.ResponseHeaders.Get("Content-disposition");

            if (string.IsNullOrEmpty(disposition))
            {
                //----返回了json格式的错误信息
                var json = Encoding.UTF8.GetString(mediaBytes);
                return WxJson.DeserializeObject<WxError>(json);
            }

            return null;
        }

        /// <summary>
        /// 上传多媒体文件时返回的处理结果
        /// </summary>
        public class UploadResult : WxError
        {
            /// <summary>
            /// 媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb，主要用于视频与音乐格式的缩略图）
            /// </summary>
            public string type { get; set; }
            /// <summary>
            /// 媒体文件上传后，获取时的唯一标识
            /// </summary>
            public string media_id { get; set; }
            /// <summary>
            /// 媒体文件上传时间戳
            /// </summary>
            public string created_at { get; set; }
        }

        /// <summary>
        /// 媒体文件类型
        /// </summary>
        public enum MediaType
        {
            image, voice, video, thumb
        }
    }
}
